package com.cskaoyan.javase.oop1._13block._2building;

/**
 * 构造代码块
 * 语法:
 * 声明在类的成员位置,用以下语法:
 * {
 *
 * }
 * 作用: 随着构造器的执行而执行,用于在创建对象过程中,给成员变量赋值
 * 注: 构造代码块随着构造器执行而执行,所以构造代码块中也能使用this关键字(但是这个this不能用于调用构造器)
 *
 * 总结,到目前位置,在创建对象过程中,给对象的成员变量赋值的方式/手段:
 *      1.默认初始化,具有默认值
 *      2.显式赋值
 *      3.构造器赋值
 *      4.构造代码块赋值
 * 以上赋值方式,默认初始化最先进行,构造器赋值最后,"掐头去尾"
 * 接下来 只需要搞清楚,显式赋值和构造代码块赋值,谁先谁后就可以了
 *      实际测试下来,发现:
 *      构造代码块和显式赋值,会按照代码的书写顺序,从上到下执行
 *
 *
 *-------------
 * 那么构造代码块为啥能够体现出这样的一个特点呢?
 * 编译器编译后的代码中,实际上并不存在构造代码块这种结构
 * 编译器会智能得将显式赋值和构造代码块赋值的语句,放入类的每一个构造器的前几行
 *      什么叫智能?
 *      是为了保证,显式赋值和构造代码块赋值,按照代码的书写顺序从上到下执行
 *
 * 以上就解释了,构造代码块为什么随着构造器的执行而执行,并且无论用哪个构造器创建对象赋值,都会执行构造代码块代码
 *      而且由于是加入构造器的前几行,构造代码块赋值要先执行
 *
 * 于是，我们可以得出以下结论：
 *
 * 1.使用new对象的方式创建对象，不论使用哪个构造器，构造代码块都会随之执行。
 * 2.构造器是每一次new对象都会执行一次，所以构造代码块也会随之执行一次。
 * 3.构造代码块中的代码要放入构造器的首几行，所以在同一个类中，构造代码块总是先于它的构造器而执行。
 *
 *
 * @since 10:14
 * @author wuguidong@cskaoyan.onaliyun.com
 */
public class Demo {
    public static void main(String[] args) {
        Student s = new Student(28);
        System.out.println(s.age);
    }
}

class Student {


    int age = 18;

    // 构造代码块
    {
        age = 100;
    }

    public Student() {
    }

    public Student(int age) {
        this.age = age;
    }
}